/*
    The NeonX Library

    Copyright (c) 2013 darkcat

    Code covered by the MIT License
*/

#pragma once

//////////////////////////////////////////////////////////////////////////

#define NX_MULTIPLE_0( ...)
#define NX_MULTIPLE_1( f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))
#define NX_MULTIPLE_2( f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_1( f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_3( f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_2( f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_4( f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_3( f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_5( f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_4( f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_6( f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_5( f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_7( f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_6( f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_8( f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_7( f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_9( f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_8( f, NX_ARGS_(__VA_ARGS__, -))

#define NX_MULTIPLE_10(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_9( f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_11(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_10(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_12(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_11(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_13(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_12(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_14(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_13(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_15(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_14(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_16(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_15(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_17(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_16(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_18(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_17(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_19(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_18(f, NX_ARGS_(__VA_ARGS__, -))

#define NX_MULTIPLE_20(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_19(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_21(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_20(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_22(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_21(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_23(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_22(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_24(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_23(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_25(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_24(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_26(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_25(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_27(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_26(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_28(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_27(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_29(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_28(f, NX_ARGS_(__VA_ARGS__, -))

#define NX_MULTIPLE_30(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_29(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_31(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_30(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_32(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_31(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_33(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_32(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_34(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_33(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_35(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_34(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_36(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_35(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_37(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_36(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_38(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_37(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_39(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_38(f, NX_ARGS_(__VA_ARGS__, -))

#define NX_MULTIPLE_40(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_39(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_41(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_40(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_42(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_41(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_43(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_42(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_44(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_43(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_45(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_44(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_46(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_45(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_47(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_46(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_48(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_47(f, NX_ARGS_(__VA_ARGS__, -))
#define NX_MULTIPLE_49(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_48(f, NX_ARGS_(__VA_ARGS__, -))

#define NX_MULTIPLE_50(f, ...)  NX_ARGS_(f(NX_CONTER(__VA_ARGS__)))NX_MULTIPLE_49(f, NX_ARGS_(__VA_ARGS__, -))

/*
    f multiply N

    NX_MULTIPLE(10, f)
    -->
    f(1)f(2)f(3)f(4)f(5)f(6)f(7)f(8)f(9)f(10)
*/

#define NX_MULTIPLE(n, f)       NX_JOIN(NX_MULTIPLE_, n)(f, -)
#define NX_MULTIPLE_MAX(f)      NX_MULTIPLE(NX_MACRO_MAX, f)
